package net.jcip.examples.chapter13;

import java.util.concurrent.locks.*;

/**
 * InterruptibleLocking
 *
 * @author Brian Goetz and Tim Peierls
 *
 * lock.lockInterruptibly() 方法
 *
 * 	•	lock.lockInterruptibly() 方法尝试获取锁，如果锁不可用（即已被其他线程持有），则当前线程会被阻塞，直到获取到锁为止。
 * 	•	与 lock.lock() 不同的是，如果在等待获取锁的过程中，当前线程被其他线程中断（调用 Thread.interrupt() 方法），则会抛出 InterruptedException 异常，而不是简单地继续等待。
 * 	•	一旦获取到了锁，线程会进入到临界区，执行需要保护的代码。
 * 	•	在临界区执行完毕后，必须使用 lock.unlock() 来释放锁，通常在 finally 块中执行，确保锁的释放不受异常影响。
 *
 */
public class InterruptibleLocking {
    //默认为非公平锁
    private Lock lock = new ReentrantLock();

    //创建一个公平锁
    //private Lock lock = new ReentrantLock(true);

    public boolean sendOnSharedLine(String message) throws InterruptedException {
        //尝试获取锁，可响应中断
        //lock.lockInterruptibly() 方法尝试获取锁，如果锁不可用（即已被其他线程持有），则当前线程会被阻塞，直到获取到锁为止。
        //如果在等待获取锁的过程中，当前线程被其他线程中断（调用 Thread.interrupt() 方法），则会抛出 InterruptedException 异常
        lock.lockInterruptibly();
        try {
            return cancellableSendOnSharedLine(message);
        } finally {
            lock.unlock();
        }
    }

    private boolean cancellableSendOnSharedLine(String message) throws InterruptedException {
        /* send something */
        return true;
    }

}
